/*特点：
    1.在一个类中的成员函数可以访问另外同一个类中的所有成员。
    即公有，保护和私有属性的成员都能访问。
        A 是 B 的友元类，A 可以访问 B 的所有成员。
        A 是怎么访问？ 
        A 通过在自己的成员函数里面访问B 类中的所有成员
    
    2.在一个（狐狸类）类中的__所有行为（函数）___可以访问另外一个（狗类）类中的_属性（变量）+行为（函数）_。
*/


#include <iostream>
#include <string>
using namespace std;

class Dog
{
friend class Fox;//声明狐类为狗类的友元类


public:
    Dog(string new_drinks,string new_bbq,string new_smoke):drinks(new_drinks),bbq(new_bbq),smoke(new_smoke)
    {
    }

private:
        string drinks; // 狗的饮料
        string bbq;    // 狗的烤肉
        string smoke;  // 狗的吸烟
};


class Fox
{
public:
        void Get_Dog_Frined_Resource(Dog & D_1); // 狐狸获取狗的资源
};


void Fox::Get_Dog_Frined_Resource(Dog & D_1)
{
    cout<<"狐狸获取到狗的资源有："<<endl;
    cout<<D_1.drinks<<endl;
    cout<<D_1.bbq<<endl;
    cout<<D_1.smoke<<endl;
}


int main()
{
    Dog d_1("老珠江 24瓶","韭菜、鸡中翅、皮蛋廋肉粥、生蚝各一份","白鲨 1包");
    Fox f_1;

    f_1.Get_Dog_Frined_Resource(d_1);

    return 0;
}

/*  1.继承的使用场景比友元常见。 之前有些学生做项目的时候，因为继承比较复杂，他就不用，
    他把全部类写成友元了（对于类的三种属性白学了）
    一般来说，在开发时，如果项目源码框架已经基本定型了，很少突然更改删除添加 基类 或者 派生类，
    突然需要功能需求 访问 成员数据，暂时 提供 一个友元函数 快速返回对应的成员数据。
    
    2.友元类其实就是友元函数在类中的运用。
*/